package com.example.myspringboot.annotation.test.mytest.aopinfo;


import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @Author ZhengShan
 * @Date 2024 06 28 17 43
 **/
@Aspect
public class MyLogAspect {

    private static final Logger logger = LoggerFactory.getLogger(MyLogAspect.class);

    /**
     * 只要用到了com.javaxl.p2.annotation.springAop.MyLog这个注解的，就是目标类
     */
    @Pointcut("@annotation(com.example.myspringboot.annotation.test.mytest.aopinfo.MyLog)")
//    这是以前的写法 @Around("execution"(* *..*Service.*Pager(..))")
//   上面这个已经把这个替代掉了 @Pointcut("@execution(* *.*Controller.add())")
    private void MyValid() {
    }

    @Before("MyValid()")
    public void before(@NotNull JoinPoint joinPoint) {
//        joinPoint
//        目标对象、目标方法、传递的参数

        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        logger.debug("[" + signature.getName() + " : start.....]");
        System.out.println("[" + signature.getName() + " : start.....]");

        MyLog myLog = signature.getMethod().getAnnotation(MyLog.class);
        logger.debug("【目标对象方法被调用时候产生的日志，记录到日志表中】：" + myLog.desc());
        System.out.println("【目标对象方法被调用时候产生的日志，记录到日志表中】：" + myLog.desc());
    }

}
